//! \file CoreThread.h
//! \brief TODO: Document
// -----------------------------------------------------------------------------
//! This program is free software; you can redistribute it and/or
//! modify it under the terms of the GNU General Public License
//! as published by the Free Software Foundation; either version 2
//! of the License, or (at your option) any later version.
//!
//! This program is distributed in the hope that it will be useful,
//! but WITHOUT ANY WARRANTY; without even the implied warranty of
//! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//! GNU General Public License for more details.
//!
//! You should have received a copy of the GNU General Public License
//! along with this program; if not, write to the Free Software Foundation,
//! Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// -----------------------------------------------------------------------------
#ifndef dCORE_THREAD_H_
#define dCORE_THREAD_H_

#include "CoreError.h"

//#ifdef __cplusplus
//extern "C"
//{
//#endif

namespace Core {

// =====[ Core Thread Data Types ]==============================================

// =============================================================================
//! \typedef tTHREAD
//! \brief TODO: document
// -----------------------------------------------------------------------------
//typedef pthread_t tTHREAD;
typedef unsigned long int tTHREAD;

// =============================================================================
//! \typedef tTHREAD_FUNCTION
//! \brief TODO: document
// -----------------------------------------------------------------------------
typedef void *(*tTHREAD_RUN_FX)(void *Arg);

// =============================================================================
// ThreadCreate
// -----------------------------------------------------------------------------
//! TODO: document
//!
//! \param [in] Arg
//!   TODO: document
//!
//! \retval Exception
//!   The success status of the requested operation.
//!   - eOKAY: Execution occurred as requested.
//!   .
//!
//! \b Example: \code
//! FxName(0);
//! \endcode
// -----------------------------------------------------------------------------
tERROR ThreadCreate(tTHREAD *pThread, tTHREAD_RUN_FX pRunFx, void *Args);

// =============================================================================
// ThreadSelf
// -----------------------------------------------------------------------------
//! TODO: document
//!
//! \param [in] Arg
//!   TODO: document
//!
//! \retval Exception
//!   The success status of the requested operation.
//!   - eOKAY: Execution occurred as requested.
//!   .
//!
//! \b Example: \code
//! FxName(0);
//! \endcode
// -----------------------------------------------------------------------------
tTHREAD ThreadSelf(void);

// =============================================================================
// ThreadJoin
// -----------------------------------------------------------------------------
//! TODO: document
//!
//! \param [in] Arg
//!   TODO: document
//!
//! \retval Exception
//!   The success status of the requested operation.
//!   - eOKAY: Execution occurred as requested.
//!   .
//!
//! \b Example: \code
//! FxName(0);
//! \endcode
// -----------------------------------------------------------------------------
tERROR ThreadJoin(tTHREAD Thread, void **pExitValue);

// =============================================================================
// FxName
// -----------------------------------------------------------------------------
//! TODO: document
//!
//! \param [in] Arg
//!   TODO: document
//!
//! \retval Exception
//!   The success status of the requested operation.
//!   - eOKAY: Execution occurred as requested.
//!   .
//!
//! \b Example: \code
//! FxName(0);
//! \endcode
// -----------------------------------------------------------------------------
void ThreadExit(void *pValue);


// MutexTrylock(m) pthread_mutex_trylock(m)
// ThreadKeyCreate(k) pthread_key_create(k,NULL)
// ThreadKeyDelete(k) pthread_key_delete(k)
// ThreadKeyGet(k) pthread_getspecific(k)
// ThreadKeySet(k,v) pthread_setspecific((k),(v))
// ThreadSigMask(how,n,o) pthread_sigmask((how),(n),(o))
// ThreadKill(thread,signo) pthread_kill((thread),(signo))

// =============================================================================
// FxName
// -----------------------------------------------------------------------------
//! TODO: document
//!
//! \param [in] Arg
//!   TODO: document
//!
//! \retval Exception
//!   The success status of the requested operation.
//!   - eOKAY: Execution occurred as requested.
//!   .
//!
//! \b Example: \code
//! FxName(0);
//! \endcode
// -----------------------------------------------------------------------------
int ThreadKill(tTHREAD Thread, int Signal);

// TOOD: comment
void ThreadJoinAll(void);

} // namespace Core


//#ifdef __cplusplus
//}
//#endif

#endif // dCORE_THREAD_H_

